package com.demo.main.service;

import com.demo.main.dao.BookDao;
import com.demo.main.dao.impl.BookDaoImpl;
import com.demo.main.entity.Book;
import com.demo.main.utils.JDBCUtil;
import com.demo.main.utils.PaginationUtil;
import com.demo.main.vo.BookVo;

import java.sql.SQLException;
import java.util.List;

// 定义一个BookService类，继承自一个泛型基类BaseService，泛型参数为Book和Integer
// 这个类用于封装与书籍相关的业务逻辑
public class BookService extends BaseService<Book, Integer> {
    // 定义一个BookDao类型的成员变量bookDao，并初始化为BookDaoImpl的实例
    // 这个成员变量用于访问数据库，执行与书籍相关的操作
    private final BookDao bookDao = new BookDaoImpl();

    // 构造方法，调用父类的构造方法，并传入bookDao实例
    public BookService() {
        super(new BookDaoImpl()); // 调用父类的构造方法，传入一个新的BookDaoImpl实例（这里有些冗余）
    }

    // 根据指定的条件（书籍标题、作者、ISBN、类别名称）和页码，查询书籍视图对象的列表
    public List<BookVo> findBookVoBySpecifiedCondition(BookVo book, int pageNum) {
        // 调用findBookVoByCondition方法，传入书籍的各个条件和页码，返回查询结果
        return findBookVoByCondition(book.getTitle(), book.getAuthor(), book.getIsbn(), book.getCategoryName(), pageNum);
    }

    // 根据指定的条件（书籍标题、作者、ISBN、类别名称）和页码，查询书籍视图对象的列表
    public List<BookVo> findBookVoByCondition(String title, String author, String isbn, String bookCategoryName, int pageNum) {
        // 调用bookDao的selectBookVoByCondition方法，传入条件和页码，返回查询结果
        return bookDao.selectBookVoByCondition(title, author, isbn, bookCategoryName, pageNum);
    }

    // 根据页码查询书籍视图对象的列表（默认查询第一页）
    public List<BookVo> findBookVo(int pageNum) {
        // 调用bookDao的selectAllBookVo方法，传入页码，返回查询结果
        return bookDao.selectAllBookVo(pageNum);
    }

    // 查询所有书籍视图对象的列表
    public List<BookVo> findBookVo() {
        // 调用bookDao的selectAllBookVo方法，传入页码1，返回查询结果
        return bookDao.selectAllBookVo(1);
    }

    // 根据指定的条件查询符合条件的书籍视图对象的数量
    public Integer findBookVoCountByCondition(String title, String author, String isbn, String bookCategoryName) {
        // 调用bookDao的selectBookVoCountByCondition方法，传入条件，返回查询结果
        return bookDao.selectBookVoCountByCondition(title, author, isbn, bookCategoryName);
    }

    // 根据BookVo对象中的条件计算分页的总页数
    public Integer findBookVoPageCountByCondition(BookVo book) {
        // 调用PaginationUtil的pageCount方法，传入符合条件的书籍数量，计算并返回总页数
        return PaginationUtil.pageCount(findBookVoCountByCondition(book.getTitle(), book.getAuthor(), book.getIsbn(), book.getCategoryName()));
    }

    // 计算所有书籍的分页总页数
    public Integer findBookVoPageCountByCondition() {
        // 调用PaginationUtil的pageCount方法，传入所有书籍的数量（不传入条件），计算并返回总页数
        return PaginationUtil.pageCount(findBookVoCountByCondition(null, null, null, null));
    }

    // 执行借书操作，根据用户ID、书籍ID和借阅天数调用存储过程
    public JDBCUtil.StoredProcedureResult borrowBook(int userId, int bookId, int borrowDays) {
        try {
            // 调用bookDao的borrowBook方法，传入用户ID、书籍ID和借阅天数，执行存储过程并返回结果
            JDBCUtil.StoredProcedureResult result = bookDao.borrowBook(userId, bookId, borrowDays);
            return result; // 返回存储过程的结果
        } catch (SQLException e) {
            // 捕获SQLException异常，打印异常信息，并返回一个表示操作失败的结果对象
            e.printStackTrace();
            return new JDBCUtil.StoredProcedureResult(false, "借书操作发生异常: " + e.getMessage());
        }
    }

    // 执行还书操作，根据用户ID和书籍ID调用存储过程
    public JDBCUtil.StoredProcedureResult returnBook(int userId, int bookId) {
        try {
            // 调用bookDao的returnBook方法，传入用户ID和书籍ID，执行存储过程并返回结果
            JDBCUtil.StoredProcedureResult result = bookDao.returnBook(userId, bookId);
            return result; // 返回存储过程的结果
        } catch (SQLException e) {
            // 捕获SQLException异常，打印异常信息，并返回一个表示操作失败的结果对象
            e.printStackTrace();
            return new JDBCUtil.StoredProcedureResult(false, "还书操作发生异常: " + e.getMessage());
        }
    }

    // 根据书籍ID查询书籍视图对象
    public Book findBookVoById(int bookId) {
        // 创建一个Book对象，并设置其书籍ID
        Book book = new Book();
        book.setBookId(bookId);
        return bookDao.selectOneByCondition(book);
    }
}